package cn.coisini.utils;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

/**
 * @author xiangshaw
 * Description: 时间转换工具类
 */
public class TimeConverterUtil {
    // 添加私有构造函数
    private TimeConverterUtil() {
        // 防止该类被实例化
        throw new AssertionError("Utility class should not be instantiated");
    }

    // 使用自定义格式化模式
    private static final DateTimeFormatter ISO_FORMATTER = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral('T')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .optionalStart()
            .appendOffsetId()
            .optionalEnd()
            .toFormatter();

    private static final DateTimeFormatter CUSTOM_FORMATTER = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral('T')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            // 添加字面值 'Z' 表示时区偏移量
            .appendLiteral('Z')
            .toFormatter();

    /**
     * 将UTC时间转换为指定时区的时间，格式保持ISO-8601 默认时区为东八区
     *
     * @param utcTimeString UTC时间字符串（ISO-8601格式）
     * @return 指定时区的时间字符串（ISO-8601格式）
     */
    public static String convertUtcToLocal(String utcTimeString) {
        String zoneIdString = "Asia/Shanghai";
        return convertUtcToLocal(utcTimeString, zoneIdString);
    }

    /**
     * 将UTC时间转换为指定时区的时间，格式保持ISO-8601
     *
     * @param utcTimeString UTC时间字符串（ISO-8601格式）
     * @param zoneIdString  时区ID，如"Asia/Shanghai"
     * @return 指定时区的时间字符串（ISO-8601格式）
     */
    public static String convertUtcToLocal(String utcTimeString, String zoneIdString) {
        Instant utcTime = Instant.parse(utcTimeString);
        ZonedDateTime localTime = utcTime.atZone(ZoneId.of(zoneIdString));
        DateTimeFormatter formatter = CUSTOM_FORMATTER.withZone(ZoneId.of(zoneIdString));
        return formatter.format(localTime);
    }

    /**
     * 将本地时间转换为UTC时间
     *
     * @param localTimeString 本地时间字符串（ISO-8601格式）
     *                        zoneIdString    时区ID，如"Asia/Shanghai"
     * @return UTC时间字符串（ISO-8601格式）
     */
    public static String convertLocalToUtc(String localTimeString) {
        String zoneIdString = "Asia/Shanghai";
        return convertLocalToUtc(localTimeString, zoneIdString);
    }

    /**
     * 将本地时间转换为UTC时间
     *
     * @param localTimeString 本地时间字符串（ISO-8601格式）
     * @param zoneIdString    时区ID，如"Asia/Shanghai"
     * @return UTC时间字符串（ISO-8601格式）
     */
    public static String convertLocalToUtc(String localTimeString, String zoneIdString) {
        ZonedDateTime localTime = ZonedDateTime.parse(localTimeString, CUSTOM_FORMATTER.withZone(ZoneId.of(zoneIdString)));
        Instant utcTime = localTime.toInstant();
        return ISO_FORMATTER.format(utcTime.atZone(ZoneId.of("UTC")));
    }
}
